﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.ServiceModel.Web;
using MSH.Common.Business;
using MSH.Common.Classes;
using MSH.Common.DAO;
using MSH.Common.DAO.Results;

namespace MSH.Server.Webservice
{
    /// <summary>
    /// Interface van de MSH server webservice
    /// </summary>
    [ServiceContract] 
    public interface IMSHService
    {
        /// <summary>
        /// Inloggen als gebruiker
        /// </summary>
        /// <param name="username">Gebruikersnaam</param>
        /// <param name="password">Wachtwoord</param>
        /// <param name="mobilePhoneType">OS van de telefoon</param>
        /// <returns>Login result object</returns>
        [OperationContract]
        [WebGet(            
            UriTemplate = "Login/{username}/{password}/{mobilePhoneType}",
            BodyStyle = WebMessageBodyStyle.Bare,
            ResponseFormat = WebMessageFormat.Json,
            RequestFormat = WebMessageFormat.Json
            )]
        LoginResult Login(String username, String password, String mobilePhoneType);

        /// <summary>
        /// Registreren als gebruiker
        /// </summary>
        /// <param name="username">Gebruikersnaam</param>
        /// <param name="password">Wachtwoord</param>
        /// <param name="mobilePhoneNumber">Mobiele telefoonnummer</param>
        /// <returns>Enumeratie van het registreer resultaat</returns>
        [OperationContract]
        [WebGet(
            UriTemplate = "Register/{username}/{password}/{mobilePhoneNumber}",
            BodyStyle = WebMessageBodyStyle.Bare,
            ResponseFormat = WebMessageFormat.Json,
            RequestFormat = WebMessageFormat.Json
            )]
        RegisterResultEnum Register(String username, String password, String mobilePhoneNumber);

        /// <summary>
        /// Nieuwe aanvraag van het versturen van een activatiecode via SMS
        /// </summary>
        /// <param name="username">Gebruikersnaam</param>
        /// <param name="password">Wachtwoord</param>
        /// <param name="mobilePhoneNumber">Mobiele nummer waar het account aan gekoppeld word</param>
        /// <returns>Enumeratie van het ResendActivation resultaat</returns>
        [WebGet(
            UriTemplate = "ResendActivationCode/{username}/{password}/{mobilePhoneNumber}",
            BodyStyle = WebMessageBodyStyle.Bare,
            ResponseFormat = WebMessageFormat.Json,
            RequestFormat = WebMessageFormat.Json
            )]
        ResendActivationResultEnum ResendActivationCode(String username, String password, String mobilePhoneNumber);

        /// <summary>
        /// Activeren van een account met de activatie code
        /// </summary>
        /// <param name="username">Gebruikersnaam</param>
        /// <param name="password">Wacthwoord</param>
        /// <param name="activationCode">Activatiecode ontvangen via sms</param>
        /// <returns>Enumeratie met het resultaat van de activatie</returns>
        [WebGet(
            UriTemplate = "Activate/{username}/{password}/{activationCode}",
            BodyStyle = WebMessageBodyStyle.Bare,
            ResponseFormat = WebMessageFormat.Json,
            RequestFormat = WebMessageFormat.Json
            )]
        ActivationResultEnum Activate(String username, String password, String activationCode);

        /// <summary>
        /// Updaten van de huidige locatie
        /// </summary>
        /// <param name="token">Token van ingelogde gebruiker</param>
        /// <param name="latitude">Latidude</param>
        /// <param name="longitude">Longitude</param>
        /// <returns>UpdateLocationResult met de gegevens van de nieuwe locatie</returns>
        [WebGet(
            UriTemplate = "UpdateLocation/{token}/{latitude}/{longitude}",
            BodyStyle = WebMessageBodyStyle.Bare,
            ResponseFormat = WebMessageFormat.Json,
            RequestFormat = WebMessageFormat.Json            
            )]
        UpdateLocationResult UpdateLocation(String token, String latitude, String longitude);

        /// <summary>
        /// Ophalen van het gebruikersprofiel van een gebruiker
        /// </summary>
        /// <param name="token">Token van ingelogde gebruiker</param>
        /// <param name="username">Gebruikersnaam van het op te halen profiel</param>
        /// <returns></returns>
        [WebGet(
            UriTemplate = "GetUserProfile/{token}/{username}",
            BodyStyle = WebMessageBodyStyle.Bare,
            ResponseFormat = WebMessageFormat.Json,
            RequestFormat = WebMessageFormat.Json
            )]
        GetUserProfileResult GetUserProfile(String token, String username);

        /// <summary>
        /// Ophalen van de vriendenlijst van de ingelogde gebruiker
        /// </summary>
        /// <param name="token">Token van ingelogde gebruiker</param>
        /// <returns>GetFriendListResult met daarin een lijst van Friend objecten</returns>
        [WebGet(
            UriTemplate = "GetFriendList/{token}",
            BodyStyle = WebMessageBodyStyle.Bare,
            ResponseFormat = WebMessageFormat.Json,
            RequestFormat = WebMessageFormat.Json
            )]
        GetFriendListResult GetFriendList(String token);

        /// <summary>
        /// Ophalen van een lijst met vrienden en onbekenden uit de buurt
        /// </summary>
        /// <param name="token">Token van ingelogde gebruiker</param>
        /// <param name="range">Range waarbinnen gezocht moet worden</param>
        /// <returns></returns>
        [WebGet(
            UriTemplate = "GetPeopleNearby/{token}/{range}",
            BodyStyle = WebMessageBodyStyle.Bare,
            ResponseFormat = WebMessageFormat.Json,
            RequestFormat = WebMessageFormat.Json
            )]
        GetPeopleNearbyResult GetPeopleNearby(String token, String range);

        /// <summary>
        /// Versturen van een chat bericht naar een gebruiker
        /// </summary>
        /// <param name="token">Token van ingelogde gebruiker</param>
        /// <param name="toUsername">Gebruikersnaam van de ontvanger</param>
        /// <param name="message">Bericht</param>
        /// <returns></returns>
        [WebGet(
            UriTemplate = "NewChatMessage/{token}/{ToUsername}/{Message}",
            BodyStyle = WebMessageBodyStyle.Bare,
            ResponseFormat = WebMessageFormat.Json,
            RequestFormat = WebMessageFormat.Json
            )]
        NewChatMessageResult NewChatMessage(String token, String toUsername, String message);

        /// <summary>
        /// Ophalen van alle ontvangen chatmessages
        /// </summary>
        /// <param name="token">Token van ingelogde gebruiker</param>
        /// <returns>GetChatMessagesResult met daarin een lijst van ChatMessage objecten</returns>
        [WebGet(
            UriTemplate = "GetChatMessages/{token}",
            BodyStyle = WebMessageBodyStyle.Bare,
            ResponseFormat = WebMessageFormat.Json,
            RequestFormat = WebMessageFormat.Json
            )]
        GetChatMessagesResult GetChatMessages(String token);

        /// <summary>
        /// Toevoegen van een vriend, dit wil zeggen een uitnodiging sturen
        /// </summary>
        /// <param name="token">Token van ingelogde gebruiker</param>
        /// <param name="username">Gebruikernaam van de vriend</param>
        /// <returns></returns>
        [WebGet(
            UriTemplate = "AddFriend/{token}/{username}",
            BodyStyle = WebMessageBodyStyle.Bare,
            ResponseFormat = WebMessageFormat.Json,
            RequestFormat = WebMessageFormat.Json
            )]
        AddFriendResult AddFriend(String token, String username);

        /// <summary>
        /// Zoeken naar vrienden en onbekenden met een openbaar profiel
        /// </summary>
        /// <param name="token">Token van ingelogde gebruiker</param>
        /// <param name="username">Gebruikersnaam</param>
        /// <param name="firstname">Voornaam</param>
        /// <param name="surname">Achternaam</param>
        /// <param name="age">Leeftijd</param>
        /// <param name="city">Woonplaats</param>
        /// <param name="mobilePhoneNumber">Mobiel telefoonnummer</param>
        /// <param name="first">Aantal resultaten</param>
        /// <param name="skip">Resultaten vanaf</param>
        /// <returns>SearchPeopleResult met daarin SearchResult object van gebruikers die voldoen aan de criteria</returns>
        [WebGet(
            UriTemplate = "SearchPeople/{token}?q1={username}&q2={firstname}&q3={surname}&q4={age}&q5={city}&q6={mobilePhoneNumber}&first={first}&skip={skip}",
            BodyStyle = WebMessageBodyStyle.Bare,
            ResponseFormat = WebMessageFormat.Json,
            RequestFormat = WebMessageFormat.Json
            )]
        SearchPeopleResult SearchPeople(String token, String username, String firstname, String surname, String age, String city, String mobilePhoneNumber, int first, int skip); 

        /// <summary>
        /// Blokkeren van een vriend
        /// </summary>
        /// <param name="token">Token van ingelogde gebruiker</param>
        /// <param name="username">Gebruikersnaam van de vriend</param>
        /// <returns>BlockFriendResult met een enum of het blokkeren gelukt is</returns>
        [WebGet(
            UriTemplate = "BlockFriend/{token}/{username}",
            BodyStyle = WebMessageBodyStyle.Bare,
            ResponseFormat = WebMessageFormat.Json,
            RequestFormat = WebMessageFormat.Json
            )]
        BlockFriendResult BlockFriend(String token, String username);

        /// <summary>
        /// Deblokkeren van een vriend
        /// </summary>
        /// <param name="token">Token van ingelogde gebruiker</param>
        /// <param name="username">Gebruikersnaam van de vriend</param>
        /// <returns>UnblockFriendResult met een enum of het deblokkeren gelukt is</returns>
        [WebGet(
            UriTemplate = "UnblockFriend/{token}/{username}",
            BodyStyle = WebMessageBodyStyle.Bare,
            ResponseFormat = WebMessageFormat.Json,
            RequestFormat = WebMessageFormat.Json
            )]
        UnblockFriendResult UnblockFriend(String token, String username);

        /// <summary>
        /// Ophalen van alle uitnodigingen die de ingelogde gebruiker binnen heeft gekregen
        /// </summary>
        /// <param name="token">Token van ingelogde gebruiker</param>
        /// <returns>GetFriendInvitationsResult met daarin een lijst van Friend object</returns>
        [WebGet(
            UriTemplate = "GetFriendInvitations/{token}",
            BodyStyle = WebMessageBodyStyle.Bare,
            ResponseFormat = WebMessageFormat.Json,
            RequestFormat = WebMessageFormat.Json
            )]
        GetFriendInvitationsResult GetFriendInvitations(String token);

        /// <summary>
        /// Accepteren van een binnenkomende vriend uitnodiging
        /// </summary>
        /// <param name="token">Token van ingelogde gebruiker</param>
        /// <param name="username">Gebruikersnaam van de uitnodiger</param>
        /// <returns>AcceptFriendInvitationResult met daarin een enumeratie of het gelukt is</returns>
        [WebGet(
            UriTemplate = "AcceptFriendInvitation/{token}/{username}",
            BodyStyle = WebMessageBodyStyle.Bare,
            ResponseFormat = WebMessageFormat.Json,
            RequestFormat = WebMessageFormat.Json
            )]
        AcceptFriendInvitationResult AcceptFriendInvitation(String token, String username);

        /// <summary>
        /// Afwijzen van een binnenkomende vriend uitnodiging
        /// </summary>
        /// <param name="token">Token van ingelogde gebruiker</param>
        /// <param name="username">Gebruikersnaam van de uitnodiger</param>
        /// <returns>DeclineFriendInvitationResult met daarin een enumeratie of het gelukt is</returns>
        [WebGet(
            UriTemplate = "DeclineFriendInvitation/{token}/{username}",
            BodyStyle = WebMessageBodyStyle.Bare,
            ResponseFormat = WebMessageFormat.Json,
            RequestFormat = WebMessageFormat.Json
            )]
        DeclineFriendInvitationResult DeclineFriendInvitation(String token, String username);

        /// <summary>
        /// Verwijderen van een vriend
        /// </summary>
        /// <param name="token">Token van ingelogde gebruiker</param>
        /// <param name="username">Gebruikersnaam van de vriend</param>
        /// <returns>RemoveFriendResult met daarin een enumeratie of het gelukt is</returns>
        [WebGet(
            UriTemplate = "RemoveFriend/{token}/{username}",
            BodyStyle = WebMessageBodyStyle.Bare,
            ResponseFormat = WebMessageFormat.Json,
            RequestFormat = WebMessageFormat.Json
            )]
        RemoveFriendResult RemoveFriend(String token, String username);

        /// <summary>
        /// Wijzig de status van de ingelogde gebruiker
        /// </summary>
        /// <param name="token">Token van ingelogde gebruiker</param>
        /// <param name="status">Statusbericht</param>
        /// <returns>SetStatusResult</returns>
        [WebGet(
            UriTemplate = "SetStatus/{token}/{status}",
            BodyStyle = WebMessageBodyStyle.Bare,
            ResponseFormat = WebMessageFormat.Json,
            RequestFormat = WebMessageFormat.Json
            )]
        SetStatusResult SetStatus(String token, String status);

        /// <summary>
        /// Haal een lijst op met gekoppelde socialnetworkaccount van de ingelogde gebruiker
        /// </summary>
        /// <param name="token">Token van ingelogde gebruiker</param>
        /// <param name="includeLogos">Boolen of de logo's meegestuurd moeten worden</param>
        /// <returns>GetSocialNetworkAccounts met daarin een lijst van SocialNetworkAccount objecten</returns>
        [WebGet(
            UriTemplate = "GetSocialNetworkAccounts/{token}/{includeLogos}",
            BodyStyle = WebMessageBodyStyle.Bare,
            ResponseFormat = WebMessageFormat.Json,
            RequestFormat = WebMessageFormat.Json
            )]
        GetSocialNetworkAccountsResult GetSocialNetworkAccounts(String token, String includeLogos);

        /// <summary>
        /// Valideren van de social network authenticationurl.
        /// </summary>
        /// <param name="token">Token van ingelogde gebruiker</param>
        /// <param name="provider">social network provider</param>
        /// <param name="url">authenticatie url</param>
        /// <returns>ValidateSocialNetworkAuthenticationURLResult met daarin een boolean of de url valide is</returns>
        [WebGet(
            UriTemplate = "ValidateSocialNetworkAuthenticationURL/{token}/{provider}?url={url}",
            BodyStyle = WebMessageBodyStyle.Bare,
            ResponseFormat = WebMessageFormat.Json,
            RequestFormat = WebMessageFormat.Json
            )]
        ValidateSocialNetworkAuthenticationURLResult ValidateSocialNetworkAuthenticationURL(String token, String provider, String url);

        /// <summary>
        /// Verwijderen van een gekoppeld social network account
        /// </summary>
        /// <param name="token">Token van ingelogde gebruiker</param>
        /// <param name="provider">social network provider</param>
        /// <returns>RemoveSocialNetworkAccountResult</returns>
        [WebGet(
            UriTemplate = "RemoveSocialNetworkAccount/{token}/{provider}",
            BodyStyle = WebMessageBodyStyle.Bare,
            ResponseFormat = WebMessageFormat.Json,
            RequestFormat = WebMessageFormat.Json
            )]
        RemoveSocialNetworkAccountResult RemoveSocialNetworkAccount(String token, String provider);

        /// <summary>
        /// Het updaten van de privacy instellingen van de gebruiker
        /// </summary>
        /// <param name="token">Token van ingelogde gebruiker</param>
        /// <param name="locationPrivacy">Privacy instelling voor de locatie</param>
        /// <param name="profilePrivacy">Privacy instelling voor het profiel</param>
        /// <returns>UpdateSettingsResult</returns>
        [WebGet(
            UriTemplate = "UpdateSettings/{token}/{locationPrivacy}/{profilePrivacy}",
            BodyStyle = WebMessageBodyStyle.Bare,
            ResponseFormat = WebMessageFormat.Json,
            RequestFormat = WebMessageFormat.Json
            )]
        UpdateSettingsResult UpdateSettings(String token, String locationPrivacy, String profilePrivacy);

        /// <summary>
        /// Updaten van het gebruikersprofiel
        /// </summary>
        /// <param name="token">Token van ingelogde gebruiker</param>
        /// <param name="mobilePhoneNumber">Mobiele nummer</param>
        /// <param name="firstName">Voornaam</param>
        /// <param name="surname">Achternaam</param>
        /// <param name="address">Adres</param>
        /// <param name="zipcode">Postcode</param>
        /// <param name="city">Woonplaats</param>
        /// <param name="sex">Geslacht</param>
        /// <param name="dateOfBirth">Geboorte datum</param>
        /// <param name="website">Website</param>
        /// <returns>UpdateProfileResult</returns>
        [WebGet(
            UriTemplate = "UpdateProfile/{token}?q1={mobilePhoneNumber}&q2={firstName}&q3={surname}&q4={address}&q5={zipcode}&q6={city}&q7={sex}&q8={dateOfBirth}&q9={website}",
            BodyStyle = WebMessageBodyStyle.Bare,
            ResponseFormat = WebMessageFormat.Json,
            RequestFormat = WebMessageFormat.Json
            )]
        UpdateProfileResult UpdateProfile(String token, String mobilePhoneNumber, String firstName, String surname, String address, String zipcode, String city, String sex, String dateOfBirth, String website);

        /// <summary>
        /// Nodig een vriend uit aan de hand van zijn mobiele telefoonnummer
        /// </summary>
        /// <param name="token">Token van ingelogde gebruiker</param>
        /// <param name="phoneNumber">Mobiele telefoonnummer</param>
        /// <returns>AddFriendByPhoneNumberResult met daarin een enumeratie of het gelukt is</returns>
        [WebGet(
            UriTemplate = "AddFriendByPhoneNumber/{token}/{phoneNumber}",
            BodyStyle = WebMessageBodyStyle.Bare,
            ResponseFormat = WebMessageFormat.Json,
            RequestFormat = WebMessageFormat.Json
            )]
        AddFriendByPhoneNumberResult AddFriendByPhoneNumber(String token, String phoneNumber);

        /// <summary>
        /// Een notificatie een een vriend toevoegen wanneer diegene binnen een bepaalde range komt.
        /// </summary>
        /// <param name="token">Token van ingelogde gebruiker</param>
        /// <param name="friendUsername">Gebruikersnaam van de vriend</param>
        /// <param name="latitude">Latitude</param>
        /// <param name="longitude">Longitude</param>
        /// <param name="range">Afstand waarbinnen de vriend zich moet bevinden in Km</param>
        /// <returns>AddFriendNotificationResult met daarin een enumeratie of het gelukt is</returns>
        [WebGet(
            UriTemplate = "AddFriendNotification/{token}/{friendUsername}/{latitude}/{longitude}/{range}",
            BodyStyle = WebMessageBodyStyle.Bare,
            ResponseFormat = WebMessageFormat.Json,
            RequestFormat = WebMessageFormat.Json
            )]
        AddFriendNotificationResult AddFriendNotification(String token, String friendUsername, String latitude, String longitude, String range);

        /// <summary>
        /// Ophalen van een bestaande notificatie tussen de ingelogde gebruiker en zijn vriend
        /// </summary>
        /// <param name="token">Token van ingelogde gebruiker</param>
        /// <param name="friendUsername">Gebruikersnaam van de vriend</param>
        /// <returns>GetFriendNotificationResult met daarin een Notificatie object</returns>
        [WebGet(
            UriTemplate = "GetFriendNotification/{token}/{friendUsername}",
            BodyStyle = WebMessageBodyStyle.Bare,
            ResponseFormat = WebMessageFormat.Json,
            RequestFormat = WebMessageFormat.Json
            )]
        GetFriendNotificationResult GetFriendNotification(String token, String friendUsername);

        /// <summary>
        /// Ophalen met een lijst van vriend suggesties
        /// </summary>
        /// <param name="token">Token van ingelogde gebruiker</param>
        /// <returns>GetFriendSuggestionsResult met daarin een lijst van Friend objecten</returns>
        [WebGet(
            UriTemplate = "GetFriendSuggestions/{token}",
            BodyStyle = WebMessageBodyStyle.Bare,
            ResponseFormat = WebMessageFormat.Json,
            RequestFormat = WebMessageFormat.Json
            )]
        GetFriendSuggestionsResult GetFriendSuggestions(String token);

        /// <summary>
        /// Aanvraag voor het wijzigen van het wachtwoord
        /// </summary>
        /// <param name="username">Gebruikersnaam</param>
        /// <param name="newPassword">Nieuw wachtwoord</param>
        /// <param name="mobilePhoneNumber">Mobiel nummer voor verificatie sms</param>
        /// <returns>ChangePasswordRequestResult met daarin een enumeratie of het gelukt is</returns>
        [WebGet(
            UriTemplate = "ChangePasswordRequest/{username}/{newPassword}/{mobilePhoneNumber}",
            BodyStyle = WebMessageBodyStyle.Bare,
            ResponseFormat = WebMessageFormat.Json,
            RequestFormat = WebMessageFormat.Json
            )]
        ChangePasswordRequestResult ChangePasswordRequest(String username, String newPassword, String mobilePhoneNumber);

        /// <summary>
        /// Activeren van een aanvraag voor het wijzigen van het wachtwoord
        /// </summary>
        /// <param name="username">Gebruikersnaam</param>
        /// <param name="activationCode">Activatie code</param>
        /// <returns>ActivatePasswordRequestResult met daarin een enumeratie of het gelukt is</returns>
        [WebGet(
            UriTemplate = "ActivatePasswordRequest/{username}/{activationCode}",
            BodyStyle = WebMessageBodyStyle.Bare,
            ResponseFormat = WebMessageFormat.Json,
            RequestFormat = WebMessageFormat.Json
            )]
        ActivatePasswordRequestResult ActivatePasswordRequest(String username, String activationCode);

        /// <summary>
        /// Aanvraag voor het wijzigen van het mobiele nummer
        /// </summary>
        /// <param name="token">Token van ingelogde gebruiker</param>
        /// <param name="newMobilePhoneNumber">Nieuwe mobiele nummer</param>
        /// <param name="password">Wachtwoord van het ingelogde account</param>
        /// <returns>ChangeMobilePhoneNumberRequestResult met daarin een enumeratie of het gelukt is</returns>
        [WebGet(
            UriTemplate = "ChangeMobilePhoneNumberRequest/{token}/{newMobilePhoneNumber}/{password}",
            BodyStyle = WebMessageBodyStyle.Bare,
            ResponseFormat = WebMessageFormat.Json,
            RequestFormat = WebMessageFormat.Json
            )]
        ChangeMobilePhoneNumberRequestResult ChangeMobilePhoneNumberRequest(String token, String newMobilePhoneNumber, String password);

        /// <summary>
        /// Activeren van de aanvraag voor het wijzigen van het mobiele nummer
        /// </summary>
        /// <param name="token">Token van ingelogde gebruiker</param>
        /// <param name="activationCode">Activatie code</param>
        /// <returns>ActivateMobilePhoneNumberRequestResult met daarin een enumeratie of het gelukt is</returns>
        [WebGet(
            UriTemplate = "ActivateMobilePhoneNumberRequest/{token}/{activationCode}",
            BodyStyle = WebMessageBodyStyle.Bare,
            ResponseFormat = WebMessageFormat.Json,
            RequestFormat = WebMessageFormat.Json
            )]
        ActivateMobilePhoneNumberRequestResult ActivateMobilePhoneNumberRequest(String token, String activationCode);

        /// <summary>
        /// Methode om snel te controleren of de server nog te bereiken is
        /// </summary>
        /// <returns>Boolean met als value true</returns>
        [WebGet(
           UriTemplate = "IsOnline",
           BodyStyle = WebMessageBodyStyle.Bare,
           ResponseFormat = WebMessageFormat.Json,
           RequestFormat = WebMessageFormat.Json
           )]
        Boolean IsOnline();



        #region Windows Phone 7 specifics

        [WebGet(
            UriTemplate = "WP7RequestTileNotification/{token}",
            BodyStyle = WebMessageBodyStyle.Bare,
            ResponseFormat = WebMessageFormat.Json,
            RequestFormat = WebMessageFormat.Json
            )]
        WP7RequestTileNotificationResult WP7RequestTileNotification(String token);

        [WebGet(
            UriTemplate = "WP7RegisterPushNotification/{token}/?uri={uri}",
            BodyStyle = WebMessageBodyStyle.Bare,
            ResponseFormat = WebMessageFormat.Json,
            RequestFormat = WebMessageFormat.Json
            )]
        WP7RegisterPushNotificationResult WP7RegisterPushNotification(String token, String uri);

        #endregion
    }
}
